// run

// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Test shift.

package main

var ians [18]int
var uans [18]uint
var pass string

func testi(i int, t1, t2, t3 int) {
	n := ((t1*3)+t2)*2 + t3
	if i != ians[n] {
		print("itest ", t1, t2, t3, pass,
			" is ", i, " sb ", ians[n], "\n")
	}
}

func index(t1, t2, t3 int) int {
	return ((t1*3)+t2)*2 + t3
}

func testu(u uint, t1, t2, t3 int) {
	n := index(t1, t2, t3)
	if u != uans[n] {
		print("utest ", t1, t2, t3, pass,
			" is ", u, " sb ", uans[n], "\n")
	}
}

func main() {
	var i int
	var u, c uint

	/*
	 * test constant evaluations
	 */
	pass = "con" // constant part

	testi(int(1234)<<0, 0, 0, 0)
	testi(int(1234)>>0, 0, 0, 1)
	testi(int(1234)<<5, 0, 1, 0)
	testi(int(1234)>>5, 0, 1, 1)

	testi(int(-1234)<<0, 1, 0, 0)
	testi(int(-1234)>>0, 1, 0, 1)
	testi(int(-1234)<<5, 1, 1, 0)
	testi(int(-1234)>>5, 1, 1, 1)

	testu(uint(5678)<<0, 2, 0, 0)
	testu(uint(5678)>>0, 2, 0, 1)
	testu(uint(5678)<<5, 2, 1, 0)
	testu(uint(5678)>>5, 2, 1, 1)

	/*
	 * test variable evaluations
	 */
	pass = "var" // variable part

	for t1 := 0; t1 < 3; t1++ { // +int, -int, uint
		for t2 := 0; t2 < 3; t2++ { // 0, +small, +large
			for t3 := 0; t3 < 2; t3++ { // <<, >>
				switch t1 {
				case 0:
					i = 1234
				case 1:
					i = -1234
				case 2:
					u = 5678
				}
				switch t2 {
				case 0:
					c = 0
				case 1:
					c = 5
				case 2:
					c = 1025
				}
				switch t3 {
				case 0:
					i <<= c
					u <<= c
				case 1:
					i >>= c
					u >>= c
				}
				switch t1 {
				case 0:
					testi(i, t1, t2, t3)
				case 1:
					testi(i, t1, t2, t3)
				case 2:
					testu(u, t1, t2, t3)
				}
			}
		}
	}
}

func init() {
	/*
	 * set the 'correct' answer
	 */

	ians[index(0, 0, 0)] = 1234
	ians[index(0, 0, 1)] = 1234
	ians[index(0, 1, 0)] = 39488
	ians[index(0, 1, 1)] = 38
	ians[index(0, 2, 0)] = 0
	ians[index(0, 2, 1)] = 0

	ians[index(1, 0, 0)] = -1234
	ians[index(1, 0, 1)] = -1234
	ians[index(1, 1, 0)] = -39488
	ians[index(1, 1, 1)] = -39
	ians[index(1, 2, 0)] = 0
	ians[index(1, 2, 1)] = -1

	uans[index(2, 0, 0)] = 5678
	uans[index(2, 0, 1)] = 5678
	uans[index(2, 1, 0)] = 181696
	uans[index(2, 1, 1)] = 177
	uans[index(2, 2, 0)] = 0
	uans[index(2, 2, 1)] = 0
}
